_stream_readable.js ➔ chunkInvalid   A
last analyzed

Complexity

Conditions 5
Paths 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 5
nc 2
nop 2
dl 0
loc 7
rs 9.3333
c 0
b 0
f 0
1
// Copyright Joyent, Inc. and other Node contributors.
2
//
3
// Permission is hereby granted, free of charge, to any person obtaining a
4
// copy of this software and associated documentation files (the
5
// "Software"), to deal in the Software without restriction, including
6
// without limitation the rights to use, copy, modify, merge, publish,
7
// distribute, sublicense, and/or sell copies of the Software, and to permit
8
// persons to whom the Software is furnished to do so, subject to the
9
// following conditions:
10
//
11
// The above copyright notice and this permission notice shall be included
12
// in all copies or substantial portions of the Software.
13
//
14
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
17
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20
// USE OR OTHER DEALINGS IN THE SOFTWARE.
21
22
'use strict';
23
24
/*<replacement>*/
25
26
var pna = require('process-nextick-args');
27
/*</replacement>*/
28
29
module.exports = Readable;
30
31
/*<replacement>*/
32
var isArray = require('isarray');
33
/*</replacement>*/
34
35
/*<replacement>*/
36
var Duplex;
37
/*</replacement>*/
38
39
Readable.ReadableState = ReadableState;
40
41
/*<replacement>*/
42
var EE = require('events').EventEmitter;
43
44
var EElistenerCount = function (emitter, type) {
45
  return emitter.listeners(type).length;
46
};
47
/*</replacement>*/
48
49
/*<replacement>*/
50
var Stream = require('./internal/streams/stream');
51
/*</replacement>*/
52
53
/*<replacement>*/
54
55
var Buffer = require('safe-buffer').Buffer;
56
var OurUint8Array = global.Uint8Array || function () {};
57
function _uint8ArrayToBuffer(chunk) {
58
  return Buffer.from(chunk);
59
}
60
function _isUint8Array(obj) {
61
  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
62
}
63
64
/*</replacement>*/
65
66
/*<replacement>*/
67
var util = require('core-util-is');
68
util.inherits = require('inherits');
69
/*</replacement>*/
70
71
/*<replacement>*/
72
var debugUtil = require('util');
73
var debug = void 0;
0 ignored issues
show
Coding Style introduced by
Consider using undefined instead of void(0). It is equivalent and more straightforward to read.
Loading history...
74
if (debugUtil && debugUtil.debuglog) {
75
  debug = debugUtil.debuglog('stream');
76
} else {
77
  debug = function () {};
78
}
79
/*</replacement>*/
80
81
var BufferList = require('./internal/streams/BufferList');
82
var destroyImpl = require('./internal/streams/destroy');
83
var StringDecoder;
84
85
util.inherits(Readable, Stream);
86
87
var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
88
89
function prependListener(emitter, event, fn) {
90
  // Sadly this is not cacheable as some libraries bundle their own
91
  // event emitter implementation with them.
92
  if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
93
94
  // This is a hack to make sure that our error handler is attached before any
95
  // userland ones.  NEVER DO THIS. This is here only because this code needs
96
  // to continue to work with older versions of Node.js that do not include
97
  // the prependListener() method. The goal is to eventually remove this hack.
98
  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
99
}
100
101 View Code Duplication
function ReadableState(options, stream) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
102
  Duplex = Duplex || require('./_stream_duplex');
103
104
  options = options || {};
105
106
  // Duplex streams are both readable and writable, but share
107
  // the same options object.
108
  // However, some cases require setting options to different
109
  // values for the readable and the writable sides of the duplex stream.
110
  // These options can be provided separately as readableXXX and writableXXX.
111
  var isDuplex = stream instanceof Duplex;
112
113
  // object stream flag. Used to make read(n) ignore n and to
114
  // make all the buffer merging and length checks go away
115
  this.objectMode = !!options.objectMode;
116
117
  if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
118
119
  // the point at which it stops calling _read() to fill the buffer
120
  // Note: 0 is a valid value, means "don't call _read preemptively ever"
121
  var hwm = options.highWaterMark;
122
  var readableHwm = options.readableHighWaterMark;
123
  var defaultHwm = this.objectMode ? 16 : 16 * 1024;
124
125
  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
126
127
  // cast to ints.
128
  this.highWaterMark = Math.floor(this.highWaterMark);
129
130
  // A linked list is used to store data chunks instead of an array because the
131
  // linked list can remove elements from the beginning faster than
132
  // array.shift()
133
  this.buffer = new BufferList();
134
  this.length = 0;
135
  this.pipes = null;
136
  this.pipesCount = 0;
137
  this.flowing = null;
138
  this.ended = false;
139
  this.endEmitted = false;
140
  this.reading = false;
141
142
  // a flag to be able to tell if the event 'readable'/'data' is emitted
143
  // immediately, or on a later tick.  We set this to true at first, because
144
  // any actions that shouldn't happen until "later" should generally also
145
  // not happen before the first read call.
146
  this.sync = true;
147
148
  // whenever we return null, then we set a flag to say
149
  // that we're awaiting a 'readable' event emission.
150
  this.needReadable = false;
151
  this.emittedReadable = false;
152
  this.readableListening = false;
153
  this.resumeScheduled = false;
154
155
  // has it been destroyed
156
  this.destroyed = false;
157
158
  // Crypto is kind of old and crusty.  Historically, its default string
159
  // encoding is 'binary' so we have to make this configurable.
160
  // Everything else in the universe uses 'utf8', though.
161
  this.defaultEncoding = options.defaultEncoding || 'utf8';
162
163
  // the number of writers that are awaiting a drain event in .pipe()s
164
  this.awaitDrain = 0;
165
166
  // if true, a maybeReadMore has been scheduled
167
  this.readingMore = false;
168
169
  this.decoder = null;
170
  this.encoding = null;
171
  if (options.encoding) {
172
    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
173
    this.decoder = new StringDecoder(options.encoding);
174
    this.encoding = options.encoding;
175
  }
176
}
177
178 View Code Duplication
function Readable(options) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
179
  Duplex = Duplex || require('./_stream_duplex');
180
181
  if (!(this instanceof Readable)) return new Readable(options);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
182
183
  this._readableState = new ReadableState(options, this);
184
185
  // legacy
186
  this.readable = true;
187
188
  if (options) {
189
    if (typeof options.read === 'function') this._read = options.read;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
190
191
    if (typeof options.destroy === 'function') this._destroy = options.destroy;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
192
  }
193
194
  Stream.call(this);
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
195
}
196
197
Object.defineProperty(Readable.prototype, 'destroyed', {
198
  get: function () {
199
    if (this._readableState === undefined) {
200
      return false;
201
    }
202
    return this._readableState.destroyed;
203
  },
204
  set: function (value) {
205
    // we ignore the value if the stream
206
    // has not been initialized yet
207
    if (!this._readableState) {
208
      return;
209
    }
210
211
    // backward compatibility, the user is explicitly
212
    // managing destroyed
213
    this._readableState.destroyed = value;
214
  }
215
});
216
217
Readable.prototype.destroy = destroyImpl.destroy;
218
Readable.prototype._undestroy = destroyImpl.undestroy;
219
Readable.prototype._destroy = function (err, cb) {
220
  this.push(null);
221
  cb(err);
222
};
223
224
// Manually shove something into the read() buffer.
225
// This returns true if the highWaterMark has not been hit yet,
226
// similar to how Writable.write() returns true if you should
227
// write() some more.
228 View Code Duplication
Readable.prototype.push = function (chunk, encoding) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
229
  var state = this._readableState;
230
  var skipChunkCheck;
231
232
  if (!state.objectMode) {
233
    if (typeof chunk === 'string') {
234
      encoding = encoding || state.defaultEncoding;
235
      if (encoding !== state.encoding) {
236
        chunk = Buffer.from(chunk, encoding);
237
        encoding = '';
238
      }
239
      skipChunkCheck = true;
240
    }
241
  } else {
242
    skipChunkCheck = true;
243
  }
244
245
  return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
0 ignored issues
show
Bug introduced by
The variable skipChunkCheck does not seem to be initialized in case typeof chunk === "string" on line 233 is false. Are you sure the function readableAddChunk handles undefined variables?
Loading history...
246
};
247
248
// Unshift should *always* be something directly out of read()
249
Readable.prototype.unshift = function (chunk) {
250
  return readableAddChunk(this, chunk, null, true, false);
251
};
252
253 View Code Duplication
function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
254
  var state = stream._readableState;
255
  if (chunk === null) {
256
    state.reading = false;
257
    onEofChunk(stream, state);
258
  } else {
259
    var er;
260
    if (!skipChunkCheck) er = chunkInvalid(state, chunk);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
261
    if (er) {
262
      stream.emit('error', er);
263
    } else if (state.objectMode || chunk && chunk.length > 0) {
264
      if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
265
        chunk = _uint8ArrayToBuffer(chunk);
266
      }
267
268
      if (addToFront) {
269
        if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
270
      } else if (state.ended) {
271
        stream.emit('error', new Error('stream.push() after EOF'));
272
      } else {
273
        state.reading = false;
274
        if (state.decoder && !encoding) {
275
          chunk = state.decoder.write(chunk);
276
          if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
277
        } else {
278
          addChunk(stream, state, chunk, false);
279
        }
280
      }
281
    } else if (!addToFront) {
282
      state.reading = false;
283
    }
284
  }
285
286
  return needMoreData(state);
287
}
288
289
function addChunk(stream, state, chunk, addToFront) {
290
  if (state.flowing && state.length === 0 && !state.sync) {
291
    stream.emit('data', chunk);
292
    stream.read(0);
293
  } else {
294
    // update the buffer info.
295
    state.length += state.objectMode ? 1 : chunk.length;
296
    if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
297
298
    if (state.needReadable) emitReadable(stream);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
299
  }
300
  maybeReadMore(stream, state);
301
}
302
303
function chunkInvalid(state, chunk) {
304
  var er;
305
  if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
306
    er = new TypeError('Invalid non-string/buffer chunk');
307
  }
308
  return er;
0 ignored issues
show
Bug introduced by
The variable er does not seem to be initialized in case !_isUint8Array(chunk) &&...ed && !state.objectMode on line 305 is false. Are you sure this can never be the case?
Loading history...
309
}
310
311
// if it's past the high water mark, we can push in some more.
312
// Also, if we have no data yet, we can stand some
313
// more bytes.  This is to work around cases where hwm=0,
314
// such as the repl.  Also, if the push() triggered a
315
// readable event, and the user called read(largeNumber) such that
316
// needReadable was set, then we ought to push more, so that another
317
// 'readable' event will be triggered.
318
function needMoreData(state) {
319
  return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
320
}
321
322
Readable.prototype.isPaused = function () {
323
  return this._readableState.flowing === false;
324
};
325
326
// backwards compatibility.
327
Readable.prototype.setEncoding = function (enc) {
328
  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
329
  this._readableState.decoder = new StringDecoder(enc);
330
  this._readableState.encoding = enc;
331
  return this;
332
};
333
334
// Don't raise the hwm > 8MB
335
var MAX_HWM = 0x800000;
336 View Code Duplication
function computeNewHighWaterMark(n) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
337
  if (n >= MAX_HWM) {
338
    n = MAX_HWM;
339
  } else {
340
    // Get the next highest power of 2 to prevent increasing hwm excessively in
341
    // tiny amounts
342
    n--;
343
    n |= n >>> 1;
344
    n |= n >>> 2;
345
    n |= n >>> 4;
346
    n |= n >>> 8;
347
    n |= n >>> 16;
348
    n++;
349
  }
350
  return n;
351
}
352
353
// This function is designed to be inlinable, so please take care when making
354
// changes to the function body.
355 View Code Duplication
function howMuchToRead(n, state) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
356
  if (n <= 0 || state.length === 0 && state.ended) return 0;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
357
  if (state.objectMode) return 1;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
358
  if (n !== n) {
359
    // Only flow one buffer at a time
360
    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
361
  }
362
  // If we're asking for more than the current hwm, then raise the hwm.
363
  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
364
  if (n <= state.length) return n;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
365
  // Don't have enough
366
  if (!state.ended) {
367
    state.needReadable = true;
368
    return 0;
369
  }
370
  return state.length;
371
}
372
373
// you can override either this method, or the async _read(n) below.
374 View Code Duplication
Readable.prototype.read = function (n) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
375
  debug('read', n);
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "read".
Loading history...
376
  n = parseInt(n, 10);
377
  var state = this._readableState;
378
  var nOrig = n;
379
380
  if (n !== 0) state.emittedReadable = false;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
381
382
  // if we're doing read(0) to trigger a readable event, but we
383
  // already have a bunch of data in the buffer, then just trigger
384
  // the 'readable' event and move on.
385
  if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
386
    debug('read: emitReadable', state.length, state.ended);
387
    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
388
    return null;
389
  }
390
391
  n = howMuchToRead(n, state);
392
393
  // if we've ended, and we're now clear, then finish it up.
394
  if (n === 0 && state.ended) {
395
    if (state.length === 0) endReadable(this);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
396
    return null;
397
  }
398
399
  // All the actual chunk generation logic needs to be
400
  // *below* the call to _read.  The reason is that in certain
401
  // synthetic stream cases, such as passthrough streams, _read
402
  // may be a completely synchronous operation which may change
403
  // the state of the read buffer, providing enough data when
404
  // before there was *not* enough.
405
  //
406
  // So, the steps are:
407
  // 1. Figure out what the state of things will be after we do
408
  // a read from the buffer.
409
  //
410
  // 2. If that resulting state will trigger a _read, then call _read.
411
  // Note that this may be asynchronous, or synchronous.  Yes, it is
412
  // deeply ugly to write APIs this way, but that still doesn't mean
413
  // that the Readable class should behave improperly, as streams are
414
  // designed to be sync/async agnostic.
415
  // Take note if the _read call is sync or async (ie, if the read call
416
  // has returned yet), so that we know whether or not it's safe to emit
417
  // 'readable' etc.
418
  //
419
  // 3. Actually pull the requested chunks out of the buffer and return.
420
421
  // if we need a readable event, then we need to do some reading.
422
  var doRead = state.needReadable;
423
  debug('need readable', doRead);
424
425
  // if we currently have less than the highWaterMark, then also read some
426
  if (state.length === 0 || state.length - n < state.highWaterMark) {
427
    doRead = true;
428
    debug('length less than watermark', doRead);
429
  }
430
431
  // however, if we've ended, then there's no point, and if we're already
432
  // reading, then it's unnecessary.
433
  if (state.ended || state.reading) {
434
    doRead = false;
435
    debug('reading or ended', doRead);
436
  } else if (doRead) {
437
    debug('do read');
438
    state.reading = true;
439
    state.sync = true;
440
    // if the length is currently zero, then we *need* a readable event.
441
    if (state.length === 0) state.needReadable = true;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
442
    // call internal read method
443
    this._read(state.highWaterMark);
444
    state.sync = false;
445
    // If _read pushed data synchronously, then `reading` will be false,
446
    // and we need to re-evaluate how much data we can return to the user.
447
    if (!state.reading) n = howMuchToRead(nOrig, state);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
448
  }
449
450
  var ret;
451
  if (n > 0) ret = fromList(n, state);else ret = null;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
452
453
  if (ret === null) {
454
    state.needReadable = true;
455
    n = 0;
456
  } else {
457
    state.length -= n;
458
  }
459
460
  if (state.length === 0) {
461
    // If we have nothing in the buffer, then we want to know
462
    // as soon as we *do* get something into the buffer.
463
    if (!state.ended) state.needReadable = true;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
464
465
    // If we tried to read() past the EOF, then emit end on the next tick.
466
    if (nOrig !== n && state.ended) endReadable(this);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
467
  }
468
469
  if (ret !== null) this.emit('data', ret);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
470
471
  return ret;
472
};
473
474
function onEofChunk(stream, state) {
475
  if (state.ended) return;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
476
  if (state.decoder) {
477
    var chunk = state.decoder.end();
478
    if (chunk && chunk.length) {
479
      state.buffer.push(chunk);
480
      state.length += state.objectMode ? 1 : chunk.length;
481
    }
482
  }
483
  state.ended = true;
484
485
  // emit 'readable' now to make sure it gets picked up.
486
  emitReadable(stream);
487
}
488
489
// Don't emit readable right away in sync mode, because this can trigger
490
// another read() call => stack overflow.  This way, it might trigger
491
// a nextTick recursion warning, but that's not so bad.
492
function emitReadable(stream) {
493
  var state = stream._readableState;
494
  state.needReadable = false;
495
  if (!state.emittedReadable) {
496
    debug('emitReadable', state.flowing);
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "emitReadable".
Loading history...
497
    state.emittedReadable = true;
498
    if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
499
  }
500
}
501
502
function emitReadable_(stream) {
503
  debug('emit readable');
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "emit readable".
Loading history...
504
  stream.emit('readable');
505
  flow(stream);
506
}
507
508
// at this point, the user has presumably seen the 'readable' event,
509
// and called read() to consume some data.  that may have triggered
510
// in turn another _read(n) call, in which case reading = true if
511
// it's in progress.
512
// However, if we're not ended, or reading, and the length < hwm,
513
// then go ahead and try to read some more preemptively.
514
function maybeReadMore(stream, state) {
515
  if (!state.readingMore) {
516
    state.readingMore = true;
517
    pna.nextTick(maybeReadMore_, stream, state);
518
  }
519
}
520
521
function maybeReadMore_(stream, state) {
522
  var len = state.length;
523
  while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
524
    debug('maybeReadMore read 0');
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "maybeReadMore read 0".
Loading history...
525
    stream.read(0);
526
    if (len === state.length)
527
      // didn't get any data, stop spinning.
528
      break;else len = state.length;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
529
  }
530
  state.readingMore = false;
531
}
532
533
// abstract method.  to be overridden in specific implementation classes.
534
// call cb(er, data) where data is <= n in length.
535
// for virtual (non-string, non-buffer) streams, "length" is somewhat
536
// arbitrary, and perhaps not very meaningful.
537
Readable.prototype._read = function (n) {
0 ignored issues
show
Unused Code introduced by
The parameter n is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
538
  this.emit('error', new Error('_read() is not implemented'));
539
};
540
541 View Code Duplication
Readable.prototype.pipe = function (dest, pipeOpts) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
542
  var src = this;
543
  var state = this._readableState;
544
545
  switch (state.pipesCount) {
546
    case 0:
547
      state.pipes = dest;
548
      break;
549
    case 1:
550
      state.pipes = [state.pipes, dest];
551
      break;
552
    default:
553
      state.pipes.push(dest);
554
      break;
555
  }
556
  state.pipesCount += 1;
557
  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "pipe count=%d opts=%j".
Loading history...
558
559
  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
560
561
  var endFn = doEnd ? onend : unpipe;
562
  if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
563
564
  dest.on('unpipe', onunpipe);
565
  function onunpipe(readable, unpipeInfo) {
566
    debug('onunpipe');
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "onunpipe".
Loading history...
567
    if (readable === src) {
568
      if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
569
        unpipeInfo.hasUnpiped = true;
570
        cleanup();
571
      }
572
    }
573
  }
574
575
  function onend() {
576
    debug('onend');
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "onend".
Loading history...
577
    dest.end();
578
  }
579
580
  // when the dest drains, it reduces the awaitDrain counter
581
  // on the source.  This would be more elegant with a .once()
582
  // handler in flow(), but adding and removing repeatedly is
583
  // too slow.
584
  var ondrain = pipeOnDrain(src);
585
  dest.on('drain', ondrain);
586
587
  var cleanedUp = false;
588
  function cleanup() {
589
    debug('cleanup');
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "cleanup".
Loading history...
590
    // cleanup event handlers once the pipe is broken
591
    dest.removeListener('close', onclose);
592
    dest.removeListener('finish', onfinish);
593
    dest.removeListener('drain', ondrain);
594
    dest.removeListener('error', onerror);
595
    dest.removeListener('unpipe', onunpipe);
596
    src.removeListener('end', onend);
597
    src.removeListener('end', unpipe);
598
    src.removeListener('data', ondata);
599
600
    cleanedUp = true;
601
602
    // if the reader is waiting for a drain event from this
603
    // specific writer, then it would cause it to never start
604
    // flowing again.
605
    // So, if this is awaiting a drain, then we just call it now.
606
    // If we don't know, then assume that we are waiting for one.
607
    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
608
  }
609
610
  // If the user pushes more data while we're writing to dest then we'll end up
611
  // in ondata again. However, we only want to increase awaitDrain once because
612
  // dest will only emit one 'drain' event for the multiple writes.
613
  // => Introduce a guard on increasing awaitDrain.
614
  var increasedAwaitDrain = false;
615
  src.on('data', ondata);
616
  function ondata(chunk) {
617
    debug('ondata');
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "ondata".
Loading history...
618
    increasedAwaitDrain = false;
619
    var ret = dest.write(chunk);
620
    if (false === ret && !increasedAwaitDrain) {
621
      // If the user unpiped during `dest.write()`, it is possible
622
      // to get stuck in a permanently paused state if that write
623
      // also returned false.
624
      // => Check whether `dest` is still a piping destination.
625
      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
626
        debug('false write response, pause', src._readableState.awaitDrain);
627
        src._readableState.awaitDrain++;
628
        increasedAwaitDrain = true;
629
      }
630
      src.pause();
631
    }
632
  }
633
634
  // if the dest has an error, then stop piping into it.
635
  // however, don't suppress the throwing behavior for this.
636
  function onerror(er) {
637
    debug('onerror', er);
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "onerror".
Loading history...
638
    unpipe();
639
    dest.removeListener('error', onerror);
640
    if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
641
  }
642
643
  // Make sure our error handler is attached before userland ones.
644
  prependListener(dest, 'error', onerror);
645
646
  // Both close and finish should trigger unpipe, but only once.
647
  function onclose() {
648
    dest.removeListener('finish', onfinish);
649
    unpipe();
650
  }
651
  dest.once('close', onclose);
652
  function onfinish() {
653
    debug('onfinish');
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "onfinish".
Loading history...
654
    dest.removeListener('close', onclose);
655
    unpipe();
656
  }
657
  dest.once('finish', onfinish);
658
659
  function unpipe() {
660
    debug('unpipe');
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "unpipe".
Loading history...
661
    src.unpipe(dest);
662
  }
663
664
  // tell the dest that it's being piped to
665
  dest.emit('pipe', src);
666
667
  // start the flow if it hasn't been started already.
668
  if (!state.flowing) {
669
    debug('pipe resume');
670
    src.resume();
671
  }
672
673
  return dest;
674
};
675
676
function pipeOnDrain(src) {
677
  return function () {
678
    var state = src._readableState;
679
    debug('pipeOnDrain', state.awaitDrain);
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "pipeOnDrain".
Loading history...
680
    if (state.awaitDrain) state.awaitDrain--;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
681
    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
682
      state.flowing = true;
683
      flow(src);
684
    }
685
  };
686
}
687
688 View Code Duplication
Readable.prototype.unpipe = function (dest) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
689
  var state = this._readableState;
690
  var unpipeInfo = { hasUnpiped: false };
691
692
  // if we're not piping anywhere, then do nothing.
693
  if (state.pipesCount === 0) return this;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
694
695
  // just one destination.  most common case.
696
  if (state.pipesCount === 1) {
697
    // passed in one, but it's not the right one.
698
    if (dest && dest !== state.pipes) return this;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
699
700
    if (!dest) dest = state.pipes;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
701
702
    // got a match.
703
    state.pipes = null;
704
    state.pipesCount = 0;
705
    state.flowing = false;
706
    if (dest) dest.emit('unpipe', this, unpipeInfo);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
707
    return this;
708
  }
709
710
  // slow case. multiple pipe destinations.
711
712
  if (!dest) {
713
    // remove all.
714
    var dests = state.pipes;
715
    var len = state.pipesCount;
716
    state.pipes = null;
717
    state.pipesCount = 0;
718
    state.flowing = false;
719
720
    for (var i = 0; i < len; i++) {
721
      dests[i].emit('unpipe', this, unpipeInfo);
722
    }return this;
723
  }
724
725
  // try to find the right one.
726
  var index = indexOf(state.pipes, dest);
727
  if (index === -1) return this;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
728
729
  state.pipes.splice(index, 1);
730
  state.pipesCount -= 1;
731
  if (state.pipesCount === 1) state.pipes = state.pipes[0];
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
732
733
  dest.emit('unpipe', this, unpipeInfo);
734
735
  return this;
736
};
737
738
// set up data events if they are asked for
739
// Ensure readable listeners eventually get something
740
Readable.prototype.on = function (ev, fn) {
741
  var res = Stream.prototype.on.call(this, ev, fn);
742
743
  if (ev === 'data') {
744
    // Start flowing on next tick if stream isn't explicitly paused
745
    if (this._readableState.flowing !== false) this.resume();
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
746
  } else if (ev === 'readable') {
747
    var state = this._readableState;
748
    if (!state.endEmitted && !state.readableListening) {
749
      state.readableListening = state.needReadable = true;
750
      state.emittedReadable = false;
751
      if (!state.reading) {
752
        pna.nextTick(nReadingNextTick, this);
753
      } else if (state.length) {
754
        emitReadable(this);
755
      }
756
    }
757
  }
758
759
  return res;
760
};
761
Readable.prototype.addListener = Readable.prototype.on;
762
763
function nReadingNextTick(self) {
764
  debug('readable nexttick read 0');
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "readable nexttick read 0".
Loading history...
765
  self.read(0);
766
}
767
768
// pause() and resume() are remnants of the legacy readable stream API
769
// If the user uses them, then switch into old mode.
770
Readable.prototype.resume = function () {
771
  var state = this._readableState;
772
  if (!state.flowing) {
773
    debug('resume');
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "resume".
Loading history...
774
    state.flowing = true;
775
    resume(this, state);
776
  }
777
  return this;
778
};
779
780
function resume(stream, state) {
781
  if (!state.resumeScheduled) {
782
    state.resumeScheduled = true;
783
    pna.nextTick(resume_, stream, state);
784
  }
785
}
786
787
function resume_(stream, state) {
788
  if (!state.reading) {
789
    debug('resume read 0');
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "resume read 0".
Loading history...
790
    stream.read(0);
791
  }
792
793
  state.resumeScheduled = false;
794
  state.awaitDrain = 0;
795
  stream.emit('resume');
796
  flow(stream);
797
  if (state.flowing && !state.reading) stream.read(0);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
798
}
799
800
Readable.prototype.pause = function () {
801
  debug('call pause flowing=%j', this._readableState.flowing);
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "call pause flowing=%j".
Loading history...
802
  if (false !== this._readableState.flowing) {
803
    debug('pause');
804
    this._readableState.flowing = false;
805
    this.emit('pause');
806
  }
807
  return this;
808
};
809
810
function flow(stream) {
811
  var state = stream._readableState;
812
  debug('flow', state.flowing);
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "flow".
Loading history...
813
  while (state.flowing && stream.read() !== null) {}
0 ignored issues
show
Comprehensibility Documentation Best Practice introduced by
This code block is empty. Consider removing it or adding a comment to explain.
Loading history...
814
}
815
816
// wrap an old-style stream as the async data source.
817
// This is *not* part of the readable stream interface.
818
// It is an ugly unfortunate mess of history.
819 View Code Duplication
Readable.prototype.wrap = function (stream) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
820
  var _this = this;
821
822
  var state = this._readableState;
823
  var paused = false;
824
825
  stream.on('end', function () {
826
    debug('wrapped end');
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "wrapped end".
Loading history...
827
    if (state.decoder && !state.ended) {
828
      var chunk = state.decoder.end();
829
      if (chunk && chunk.length) _this.push(chunk);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
830
    }
831
832
    _this.push(null);
833
  });
834
835
  stream.on('data', function (chunk) {
836
    debug('wrapped data');
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "wrapped data".
Loading history...
837
    if (state.decoder) chunk = state.decoder.write(chunk);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
838
839
    // don't skip over falsy values in objectMode
840
    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
841
842
    var ret = _this.push(chunk);
843
    if (!ret) {
844
      paused = true;
845
      stream.pause();
846
    }
847
  });
848
849
  // proxy all the other methods.
850
  // important when wrapping filters and duplexes.
851
  for (var i in stream) {
0 ignored issues
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
852
    if (this[i] === undefined && typeof stream[i] === 'function') {
853
      this[i] = function (method) {
854
        return function () {
855
          return stream[method].apply(stream, arguments);
856
        };
857
      }(i);
858
    }
859
  }
860
861
  // proxy certain important events.
862
  for (var n = 0; n < kProxyEvents.length; n++) {
863
    stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
864
  }
865
866
  // when we try to consume some more bytes, simply unpause the
867
  // underlying stream.
868
  this._read = function (n) {
869
    debug('wrapped _read', n);
0 ignored issues
show
Bug introduced by
The call to debug seems to have too many arguments starting with "wrapped _read".
Loading history...
870
    if (paused) {
871
      paused = false;
872
      stream.resume();
873
    }
874
  };
875
876
  return this;
877
};
878
879
// exposed for testing purposes only.
880
Readable._fromList = fromList;
881
882
// Pluck off n bytes from an array of buffers.
883
// Length is the combined lengths of all the buffers in the list.
884
// This function is designed to be inlinable, so please take care when making
885
// changes to the function body.
886 View Code Duplication
function fromList(n, state) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
887
  // nothing buffered
888
  if (state.length === 0) return null;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
889
890
  var ret;
891
  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
892
    // read it all, truncate the list
893
    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
894
    state.buffer.clear();
895
  } else {
896
    // read part of list
897
    ret = fromListPartial(n, state.buffer, state.decoder);
898
  }
899
900
  return ret;
901
}
902
903
// Extracts only enough buffered data to satisfy the amount requested.
904
// This function is designed to be inlinable, so please take care when making
905
// changes to the function body.
906
function fromListPartial(n, list, hasStrings) {
907
  var ret;
908
  if (n < list.head.data.length) {
909
    // slice is the same for buffers and strings
910
    ret = list.head.data.slice(0, n);
911
    list.head.data = list.head.data.slice(n);
912
  } else if (n === list.head.data.length) {
913
    // first chunk is a perfect match
914
    ret = list.shift();
915
  } else {
916
    // result spans more than one buffer
917
    ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
918
  }
919
  return ret;
920
}
921
922
// Copies a specified amount of characters from the list of buffered data
923
// chunks.
924
// This function is designed to be inlinable, so please take care when making
925
// changes to the function body.
926 View Code Duplication
function copyFromBufferString(n, list) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
927
  var p = list.head;
928
  var c = 1;
929
  var ret = p.data;
930
  n -= ret.length;
931
  while (p = p.next) {
932
    var str = p.data;
933
    var nb = n > str.length ? str.length : n;
934
    if (nb === str.length) ret += str;else ret += str.slice(0, n);
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
935
    n -= nb;
936
    if (n === 0) {
937
      if (nb === str.length) {
938
        ++c;
939
        if (p.next) list.head = p.next;else list.head = list.tail = null;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
940
      } else {
941
        list.head = p;
942
        p.data = str.slice(nb);
943
      }
944
      break;
945
    }
946
    ++c;
947
  }
948
  list.length -= c;
949
  return ret;
950
}
951
952
// Copies a specified amount of bytes from the list of buffered data chunks.
953
// This function is designed to be inlinable, so please take care when making
954
// changes to the function body.
955 View Code Duplication
function copyFromBuffer(n, list) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
956
  var ret = Buffer.allocUnsafe(n);
957
  var p = list.head;
958
  var c = 1;
959
  p.data.copy(ret);
960
  n -= p.data.length;
961
  while (p = p.next) {
962
    var buf = p.data;
963
    var nb = n > buf.length ? buf.length : n;
964
    buf.copy(ret, ret.length - n, 0, nb);
965
    n -= nb;
966
    if (n === 0) {
967
      if (nb === buf.length) {
968
        ++c;
969
        if (p.next) list.head = p.next;else list.head = list.tail = null;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
970
      } else {
971
        list.head = p;
972
        p.data = buf.slice(nb);
973
      }
974
      break;
975
    }
976
    ++c;
977
  }
978
  list.length -= c;
979
  return ret;
980
}
981
982
function endReadable(stream) {
983
  var state = stream._readableState;
984
985
  // If we get here before consuming all the bytes, then that is a
986
  // bug in node.  Should never happen.
987
  if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
988
989
  if (!state.endEmitted) {
990
    state.ended = true;
991
    pna.nextTick(endReadableNT, state, stream);
992
  }
993
}
994
995
function endReadableNT(state, stream) {
996
  // Check that we didn't get one last unshift.
997
  if (!state.endEmitted && state.length === 0) {
998
    state.endEmitted = true;
999
    stream.readable = false;
1000
    stream.emit('end');
1001
  }
1002
}
1003
1004
function forEach(xs, f) {
1005
  for (var i = 0, l = xs.length; i < l; i++) {
1006
    f(xs[i], i);
1007
  }
1008
}
1009
1010
function indexOf(xs, x) {
1011
  for (var i = 0, l = xs.length; i < l; i++) {
1012
    if (xs[i] === x) return i;
0 ignored issues
show
Coding Style Best Practice introduced by
Curly braces around statements make for more readable code and help prevent bugs when you add further statements.

Consider adding curly braces around all statements when they are executed conditionally. This is optional if there is only one statement, but leaving them out can lead to unexpected behaviour if another statement is added later.

Consider:

if (a > 0)
    b = 42;

If you or someone else later decides to put another statement in, only the first statement will be executed.

if (a > 0)
    console.log("a > 0");
    b = 42;

In this case the statement b = 42 will always be executed, while the logging statement will be executed conditionally.

if (a > 0) {
    console.log("a > 0");
    b = 42;
}

ensures that the proper code will be executed conditionally no matter how many statements are added or removed.

Loading history...
1013
  }
1014
  return -1;
1015
}